package com.api.shihua.action;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.api.shihua.entity.Reward;
import com.api.shihua.util.BaseUtil;
import com.api.shihua.util.LogTool;
import weaver.conn.RecordSet;
import weaver.general.Util;

import java.text.SimpleDateFormat;
import java.util.*;

/*
    变更数据公共类  只是考虑新增以及 修改废弃数据  这样就可以 必填 exceL带入中的  错误数据
    考虑到 只更新部分的单位
    校验导入数据 的真实性   不能越过权限变更  所以需要校验  数据


 */
public class ChangeBmBaseActionV1 {
    private final static LogTool log = new LogTool("/log/zjlbg/",false);
    public JSONObject FBjsons=new JSONObject();//分部数据添加部门对应分部
    public JSONObject fbdpje_json=new JSONObject();//分部大盘金额
    public JSONObject DetailJson=new JSONObject();//建模明细数据
    public JSONObject CheckDatajson=new JSONObject();//保存校验数据
    public JSONObject sqlData=new JSONObject();//保存校验数据
    public JSONObject level_1json=new JSONObject();//一级分解对应的 分部金额金额汇总数据
    public JSONObject level_3json=new JSONObject();//一级分解对应的 部门金额金额汇总数据
    public JSONObject level_2json=new JSONObject();//二级分解对应的 部门金额汇总数据
    public JSONObject bmdpje_json=new JSONObject();//部门大盘金额

    public String level1updid="";//保存一级分类的待更新大盘金额的 的 数据的id
    public String level1updDelteid="";//保存一级分类的待更新作废的 数据的id
    public String level2updDelteid="";//保存二级分类的待更新作废的 数据的id

    public JSONObject bmbz=new JSONObject();//记录部门备注
    public JSONObject bmje=new JSONObject();//记录部门金额
    public List<Map<String, Object>> listMap=new ArrayList<Map<String, Object>>();//直接更新的 sql 语句集合
    public List<Object> Enterylist=new ArrayList<Object>();//一级模型数据
    public List<Object> leve2Enterylist=new ArrayList<Object>();//二级模型数据
    public JSONObject bmreq=new JSONObject();//部门映射的 requestid
    public SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public String currentDate=sim.format(new Date()).split(" ")[0];
    public String currentTime=sim.format(new Date()).split(" ")[1];

    public JSONObject level2_cdp=new JSONObject();//记录二级分解 纯大盘数据
    public JSONObject level2_ndp=new JSONObject();//记录二级分解 不是大盘数据

    /*
     requestid:变更流程ID
     Modeljson:单位对应的建模数据  原始数据变更之前的
     */
    public String checkDate(String requestid,JSONObject Modeljson,String formid,String bgwfmainrequestid) {
        RecordSet re = new RecordSet();
        String error="";
        //单位  个人  大盘 分解
        //sffjzcjcshgr:分解类型
        //hrfbdp:划入分部大盘
        //bjldw:被奖励单位
        //bjlbm:被奖励部门
        //ry:人员
        //bz:备注
        //je:金额
        //modelid:modelid
        try {

            //个人分解明细
            RecordSet re_dt2=new RecordSet();
            String sql_dt2="select a.requestid,b.*,c.departmentid,c.subcompanyid1,c.lastname from formtable_main_" + formid + " a,formtable_main_" + formid + "_dt3 b left join hrmresource c on b.ry=c.id  where a.id=b.mainid and a.requestid='" + requestid + "'";
            re_dt2.execute(sql_dt2);
            while(re_dt2.next()){
                String bgrequestid= Util.null2String(re_dt2.getString("requestid")).trim();
                String bjldw=Util.null2String(re_dt2.getString("bjldw")).trim() ;//被奖励单位
                String lastname=Util.null2String(re_dt2.getString("lastname")).trim() ;//姓名
                String bjlbm=Util.null2String(re_dt2.getString("bjlbm")).trim() ;//被奖励部门
                String departmentid=Util.null2String(re_dt2.getString("departmentid")).trim() ;//人员部门
                String subcompanyid1=Util.null2String(re_dt2.getString("subcompanyid1")).trim() ;//人员分部
                if(!"".equals(departmentid)){
                    bjlbm=Util.getIntValue(BaseUtil.getTopDepBydepid(departmentid+""),-1)+"";
                }
                log.writeLog("bjlbm--"+bjlbm);
                if(!"".equals(subcompanyid1)){
                    bjldw=subcompanyid1;
                }
                //
                String ry=Util.null2String(re_dt2.getString("ry")).trim() ;//人员
                String je=Util.null2String(re_dt2.getString("je")).trim() ;//金额
                String hrbmdp=Util.null2String(re_dt2.getString("hrbmdp")).trim() ;//划入部门大盘
                String bz=Util.null2String(re_dt2.getString("bz")).trim() ;//备注
                String modelid=Util.null2String(re_dt2.getString("modelid")).trim() ;//modelid

                //需要考虑 全部部门大盘 清空人员
               // if(Util.getDoubleValue(hrbmdp)>0&&Util.getDoubleValue(je)<=0&&"".equals(ry)){
               //     //ry="0";
               //     String depSubid=BaseUtil.getSubByDep(bjlbm);
               //     if (Util.getIntValue(depSubid,-1)>0){
               //         bjldw=depSubid;
               //     }
               // }
                if(Util.getDoubleValue(je)>0&&"".equals(ry)){
                    throw new Exception(BaseUtil.getDepNameByid(bjlbm)+"人员不能为空!");
                }
                //需要考虑 全部部门大盘 清空人员
                if(Util.getDoubleValue(hrbmdp)>0&&Util.getDoubleValue(je)<=0&&"".equals(ry)){
                    //ry="0";
                    String depSubid=BaseUtil.getSubByDep(bjlbm);
                    if (Util.getIntValue(depSubid,-1)>0){
                        bjldw=depSubid;
                    }

                    Double demoje= Util.getDoubleValue(level2_cdp.getString(bjlbm),0);
                    if(demoje<=0){
                        level2_cdp.put(bjlbm,hrbmdp);
                    }else{
                        throw new Exception(BaseUtil.getDepNameByid(bjlbm)+"不可重复设置部门大盘金额!");
                    }
                }else if (Util.getDoubleValue(hrbmdp)>0&&!"".equals(ry)){
                    this.level2_ndp.put(bjlbm,hrbmdp);
                }
                if("".equals(bjldw)||"".equals(bjlbm)){
                    throw new Exception(BaseUtil.getDepNameByid(bjlbm)+"二级分解部门分部有误!");
                }
                JSONObject bmJSON=this.FBjsons.getJSONObject(bjlbm);
                if(bmJSON==null||bmJSON.size()<=0 ){
                    throw new Exception(BaseUtil.getDepNameByid(bjlbm)+"二级分解部门无数据!");
                }
                JSONObject reJson=new JSONObject();
                reJson.put("bgrequestid",bgrequestid);
                reJson.put("bjldw",bjldw);
                reJson.put("bjlbm",bjlbm);
                reJson.put("ry",ry);
                reJson.put("je",je);
                reJson.put("hrbmdp",hrbmdp);
                reJson.put("bz",bz);
                reJson.put("modelid",modelid);
                setLevel_2json(bjlbm,je);//设置部门金额火鬃
                setBmpd(bjlbm,hrbmdp);//设置部门大盘汇总
                //设置数据


                setsqlData_level2(reJson);

            }
            //数据校验开始   分部=单位+分部大盘   部门=个人+部门大盘
            try {
                //个人 金额  +    大盘     单独  大盘
                log.writeLog("level2_cdp--->"+level2_cdp.toJSONString());
                log.writeLog("level2_ndp--->"+level2_ndp.toJSONString());
                if(this.level2_cdp!=null&&this.level2_cdp.size()>0){
                    Set<String> level2_cdpSet=this.level2_cdp.keySet();
                    for(String keyhh:level2_cdpSet){
                        if(!"".equals(Util.null2String(level2_ndp.getString(keyhh)))){
                            throw new Exception(BaseUtil.getDepNameByid(keyhh)+"二级分解不能同时存在大盘以及个人分解!");
                        }
                    }
                }
                //判断是否数据充足
                Set<String> FBjsonskey=this.FBjsons.keySet();
                for(String str:FBjsonskey){
                   double keyje=Util.getDoubleValue(level_2json.getString(str))  ;
                   if(keyje<=0){
                       throw new Exception(BaseUtil.getDepNameByid(str)+"二级分解部门无数据请校验!");
                   }
                }

                log.writeLog("FBjsonskey--in"+FBjsonskey.toString());
                if(FBjsonskey!=null&&FBjsonskey.size()>0){

                    for(String key:FBjsonskey){
                        JSONObject LEVEL1BM= this.FBjsons.getJSONObject(key);
                        double level1bmje = Util.getDoubleValue(LEVEL1BM.getString("dwjljebm"),0);
                        log.writeLog(key+"--level1bmje--"+level1bmje);
                        //获取二级金额 一级大盘
                        double modelbmje=Util.getDoubleValue(level_2json.getString(key),0);
                        double modelbmdpje=Util.getDoubleValue(bmdpje_json.getString(key),0);;//部门大盘
                        log.writeLog("modelbmje--"+modelbmje+" modelbmdpje"+modelbmdpje);
                        if(level1bmje!=(modelbmje+modelbmdpje)){
                            throw  new Exception(BaseUtil.getSubByDep(key)+"二级分解金额不一致:科室单位金额"+level1bmje+" 分解金额"+(modelbmje+modelbmdpje));
                        }
                    }
                }
                log.writeLog("set1--in");
               //更新数据  作废

                    //Set<String> level_1jsonkey=level_1json.keySet();
                    String fbStr=SetToString(FBjsonskey);
                    if(!"".equals(fbStr)){
                        Map<String, Object> map = new HashMap<String, Object>();
                        String updsql = " update uf_zjljlhzbb set sfyx=?,mess=?  where mainrequestid='"+bgwfmainrequestid+"' and " +
                                        "  isnull(sfyx,-1) in (0,-1) and jldwbm in ("+fbStr+") and jb in (2) ";
                        String selesql = " select  id from uf_zjljlhzbb  where mainrequestid='"+bgwfmainrequestid+"' and " +
                                          "  isnull(sfyx,-1) in (0,-1) and jldwbm in ("+fbStr+") and jb in (2) ";
                        JjZfId(selesql);
                        Object[] objects = new Object[2];
                        objects[0]=1;
                        objects[1]=requestid+"变更作废";
                        map.put("sql", updsql);
                        map.put("params", objects);
                        listMap.add(map);
                    }
                //数据组装 部门 大盘金额
                log.writeLog("set3--in");
                if(this.leve2Enterylist.size()>0){
                    for(Object obj:this.leve2Enterylist){
                        Reward reward=(Reward)obj;
                        if(reward!=null){
                            //int ObjFjlx=reward.getFjlx();
                            int ObjJldwbm=reward.getJldwbm();
                            //if(ObjFjlx==1||ObjFjlx==0){//设置大盘金额
                                reward.setHrdpjebm(Util.getDoubleValue(bmdpje_json.getString(ObjJldwbm+""),0));
                            //}
                        }
                    }
                }

            }catch(Exception e1){
                throw  new Exception("金额校验异常!"+ e1.getMessage());
            }

            log.writeLog("  level_1json"+level_1json.toJSONString());
            log.writeLog("  level_3json"+level_3json.toJSONString());
            log.writeLog("  level_2json"+level_2json.toJSONString());
            log.writeLog("  fbdpje_json"+fbdpje_json.toJSONString());
            log.writeLog("  bmdpje_json"+bmdpje_json.toJSONString());
            log.writeLog("  bmbz"+bmbz.toJSONString());
            log.writeLog("  bmje"+bmje.toJSONString());
            log.writeLog("  bmreq"+bmreq.toJSONString());
        }catch(Exception e){
            log.writeLog("Exception "+e.getMessage());
            error="校验异常"+e.getMessage();
        }
        log.writeLog("error"+error);
        return error;

    }
    //设置 一级分解对应的 分部金额汇总数据  level_1json
    public void setLevel_1json(String fb,String je){
        if(fb==null||"".equals(Util.null2String(fb).trim())){
            return;
        }
        if(level_1json==null){
                level_1json=new JSONObject();
        }

        String jsonje=Util.null2String(level_1json.getString(fb)).trim() ;
        jsonje=BaseUtil.getAdd(jsonje,je,2);
        level_1json.put(fb,jsonje);
    }
    //设置 一级分解对应的 分部金额汇总数据  level_1json
    public void setLevel_3json(String bm,String je){
        if(bm==null||"".equals(Util.null2String(bm).trim())){
            return;
        }
        if(level_3json==null){
            level_3json=new JSONObject();
        }

        String jsonje=Util.null2String(level_3json.getString(bm)).trim() ;
        jsonje=BaseUtil.getAdd(jsonje,je,2);
        level_3json.put(bm,jsonje);
    }
    //设置 一级分解对应的 分部金额汇总数据  level_1json
    public void setLevel_1json_bak(String fb,String bm,String je){
        if(bm==null||fb==null||"".equals(Util.null2String(fb).trim())){

            return;
        }
        if(level_1json==null){
            level_1json=new JSONObject();
        }
        JSONObject fbJson=level_1json.getJSONObject(fb);
        if(fbJson==null){
            fbJson=new JSONObject();
            level_1json.put(fb,fbJson);
        }
        String jsonje=Util.null2String(fbJson.getString(fb)).trim() ;
        jsonje=BaseUtil.getAdd(jsonje,je,2);
        fbJson.put(fb,jsonje);
    }

    //设置 二级分解对应的 部门金额汇总数据  leve2_1json
    public void setLevel_2json(String bm,String je){
        if(bm==null||"".equals(Util.null2String(bm).trim())){
            return;
        }
        if(level_2json==null){
            level_2json=new JSONObject();
        }
        String jsonje=level_2json.getString(bm);
        jsonje=BaseUtil.getAdd(jsonje,je,2);
        level_2json.put(bm,jsonje);
    }
    //设置 分部大盘金额
    public void setFbpd(String fb,String je)throws Exception{
        if(fbdpje_json==null){
            fbdpje_json=new JSONObject();
        }
        if(fb==null||"".equals(Util.null2String(fb).trim())){
            return;
        }
        String demodp=fbdpje_json.getString(fb);
        log.writeLog(demodp+"--"+fb+"setFbpd"+je);
        if(Util.getDoubleValue(je,0)<=0){
            return ;
        }
        if(Util.getDoubleValue(demodp,0)<=0){
            fbdpje_json.put(fb,je);
            return;
        }else{
            if(Util.getDoubleValue(demodp,0)>0&&Util.getDoubleValue(je,0)>0&&Util.getDoubleValue(je,0)!=Util.getDoubleValue(demodp,0)){
                throw  new Exception("分部大盘金额必须一致!");
            }
        }

    }
    //设置 部门大盘金额
    public void setBmpd(String bm,String je)throws Exception{
        if(fbdpje_json==null){
            fbdpje_json=new JSONObject();
        }
        if(bm==null||"".equals(Util.null2String(bm).trim())){
            return;
        }
        if(Util.getDoubleValue(je,0)<=0){
            return ;
        }
        String demodp=bmdpje_json.getString(bm);
        log.writeLog(demodp+"-setBmpd-"+bm+"setBmpd"+je);

        if(Util.getDoubleValue(demodp,0)<=0){
            bmdpje_json.put(bm,je);
            return;
        }else{
            if(Util.getDoubleValue(demodp,0)>0&&Util.getDoubleValue(je,0)>0&&Util.getDoubleValue(je,0)!=Util.getDoubleValue(demodp,0)){
                throw  new Exception("相同部门大盘金额必须一致!");
            }
        }

    }
    //设置 部门映射 requestid
    public void setBmreq(String bm,String req)throws Exception{
        if(bmreq==null){
            bmreq=new JSONObject();
        }
        if(bm==null||"".equals(Util.null2String(bm).trim())){
            return;
        }
        String reqStr=bmreq.getString(bm);
        if(!"".equals(Util.null2String(reqStr))){
            throw  new Exception("部门不可重复!");
        }else{
            bmreq.put(bm,reqStr);
        }
    }
   public void setsqlData_level1(JSONObject json)throws Exception{

   }
    public void setsqlData_level2(JSONObject json)throws Exception{

    }
    public JSONObject getBmFristJSON(String bm){

            JSONObject json=new JSONObject();
             if(bm==null||"".equals(Util.null2String(bm).trim())){
                return json;
             }
            String subid=BaseUtil.getSubByDep(bm);
            try{
                JSONObject singleJson= FBjsons.getJSONObject(subid);
                if(singleJson!=null&&singleJson.size()>0){
                    JSONArray jSONArray =singleJson.getJSONArray("1");//一级分解
                    if(jSONArray!=null&&jSONArray.size()>0){
                        for(int i=0;i<jSONArray.size();i++){
                            JSONObject BMJSON= jSONArray.getJSONObject(i);
                            if(BMJSON!=null&&BMJSON.size()>0){
                                String bmStr=BMJSON.getString("jldwbm");
                                if(bm.equals(bmStr)){
                                    return BMJSON;
                                }
                            }
                        }
                    }
                }
            }catch(Exception e){
                log.writeLog("getBmFristJSON--->"+e.getMessage());
            }
            return json;

    }
    /*
    将KEY装换成  字符串
     */
    public String  SetToString(Set<String> set){
        String result="";
        if(set!=null&&set.size()>0){
            for(String key:set){
                if(key!=null&&!"".equals(Util.null2String(key).trim())){
                    result=result+Util.null2String(key).trim()+",";
                }
            }
        }
        if(result.endsWith(",")){
            result=result.substring(0,result.length()-1);
        }
        return result;
    }
    /*
    记录作废的  ID用于还原

     */
    public void JjZfId(String sql){
        String ids="";
        RecordSet re=new RecordSet();
        if("".equals(Util.null2String(sql).trim())){
            return ;
        }
        re.execute(sql);
        while(re.next()){
            String id=re.getString("id");
            ids=ids+id+",";
        }
     log.writeLog(sql+"JjZfId--->"+ids);
    }
}
